Comment ajouter un dossier vide dans un projet Mercurial?

44

Dans mon projet, j'utilise Mercurial et un dossier lorsque l'utilisateur peut télécharger un fichier. Mais puisque l'utilisateur va télécharger des fichiers, le dossier est vide.

Je ne sais pas comment ajouter ce dossier à mon projet sans y insérer de fichier.

Savez-vous comment je peux faire?

Natim
la source

Réponses:

46

Mercurial conserve uniquement les fichiers , pas les répertoires .

Une solution consiste à ajouter un fichier .empty à votre référentiel:

$ touch uploads/.empty
$ hg add uploads/.empty
Natim
la source
1
Oui, c'est bien la solution: Mercurial ne fait que garder une trace des fichiers , pas des répertoires. Une autre solution consiste à créer les répertoires vides lorsque vous déployez votre logiciel.
Martin Geisler
2
Je pense que le nommer .hgemptypourrait donner une meilleure idée de ce à quoi il sert
User
8
Oui ou.hgkeep
Natim
2
Pourrait aussi bien aller pour verbose: .hgkeepifempty :)
Daniel Sokolowski
4

J'ai créé un script python qui automatise le processus de création / suppression de ces fichiers.

Voici la source du script: http://pastebin.com/inbYmMut

#!/usr/bin/python

# Copyright (c) 2011 Ernesto Mendez (der-design.com)
# Dual licensed under the MIT and GPL licenses:
# http://www.opensource.org/licenses/mit-license.php
# http://www.gnu.org/licenses/gpl.html

# Version 1.0.0
# - Initial Release

from __future__ import generators
import sys
from optparse import OptionParser
import os

def main():
    # Process arguments

    if len(args) > 1:
        parser.error('Too many arguments')
        sys.exit()

    elif len(args) == 0:
        parser.error('Missing filename')
        sys.exit()

    if not os.path.exists(options.directory):
        parser.error("%s: No such directory" % options.directory)
        sys.exit()

    filename = args[0]

    # Create generator

    filetree = dirwalk(os.path.abspath(options.directory))

    # Walk directory tree, create files

    if options.remove == True:

        removed = ['Removing the following files: \n']
        cmd = "rm"

        for file in filetree:
            if (os.path.basename(file) == filename):
                removed.append(file)
                cmd += " %s" % fixpath(file)

        if cmd != "rm":
            for f in removed: print f
            os.system(cmd)
        else:
            print "No files named '%s' found" % filename
            sys.exit()

    # Walk directory tree, delete files

    else:

        created = ["Creating the following files:\n"]
        cmd = "touch"

        for file in filetree:
            if (os.path.isdir(file)):
                created.append("%s%s" % (file, filename))
                cmd += " " + fixpath("%s%s" % (file, filename))

        if cmd != "touch":
            for f in created: print f
            os.system(cmd)
        else:
            print "No empty directories found"
            sys.exit()


def dirwalk(dir, giveDirs=1):
    # http://code.activestate.com/recipes/105873-walk-a-directory-tree-using-a-generator/
    for f in os.listdir(dir):
        fullpath = os.path.join(dir, f)
        if os.path.isdir(fullpath) and not os.path.islink(fullpath):
            if not len(os.listdir(fullpath)):
                yield fullpath + os.sep
            else:
                for x in dirwalk(fullpath):  # recurse into subdir
                    if os.path.isdir(x):
                        if giveDirs:
                            yield x
                    else:
                        yield x
        else:
            yield fullpath


def wrap(text, width):
    return reduce(lambda line, word, width=width: '%s%s%s' % (line, ' \n'[(len(line)-line.rfind('\n')-1 + len(word.split('\n', 1)[0] ) >= width)], word), text.split(' ') )


def fixpath(p):
    return shellquote(os.path.normpath(p))


def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"


def init_options():
    global parser, options, args
    parser = OptionParser(usage="usage: %prog [options] filename", description="Add or Remove placeholder files for SCM (Source Control Management) tools that do not support empty directories.")
    parser.add_option("-p", "--path", dest="directory", help="search within PATH", metavar="PATH")
    parser.add_option("-r", "--remove", dest="remove", action="store_true", help="remove FILE from PATH, if it's the only file on PATH")

    (options, args) = parser.parse_args()

if __name__ == '__main__':
    print
    init_options()
    main()
    print
mendezcode
la source
Le lien est mort.
Natim
Vrai, lien mis à jour ...
mendezcode
2
hébergez-le sur bitbucket (ou) github, old pastebin is old
Phyo Arkar Lwin
-1, ce script illustre les modèles et les mauvaises pratiques.
Nikratio
1

Vous faites simplement ce qui suit:

mkdir images && touch images/.hgkeep
hg add images/.hgkeep
hg commit -m"Add the images folder as an empty folder"

Notez ce qui suit comme une considération lorsque vous faites cela:

Dans votre cas, il se peut que vous téléchargiez des images dans votre environnement de développement. Je vous recommande donc également d'ajouter les éléments suivants à votre .hgignorefichier afin de ne pas valider accidentellement des images que vous n'aviez pas l'intention de valider:

^(images)\/(?!\.hgkeep)

La règle ignorera tout images/**sauf le .hgkeepfichier sur lequel vous devez ajouter un dossier "vide" au contrôle de version. La raison pour laquelle cette règle est importante est que tous les fichiers de ce dossier (c'est-à-dire images/test-image.pngressembleront à un nouveau fichier sans version dans votre fichier hg statussi vous n'ignorez pas ce modèle.

Paul Redmond
la source
2
Veuillez relire attentivement la question. Votre réponse ne répond pas à la question initiale, qui demandait "comment ajouter un dossier vide" et non "Comment ignorer un dossier"
DavidPostill
1
Tu as raison. J'ai mis à jour ma réponse pour répondre à la question. J'ai modifié mes conseils et je les ai laissés parce qu'il est important de connaître le comportement souhaité 99% du temps.
Paul Redmond
@PaulRedmond Que se passe-t-il si imagesun répertoire est situé dans le chemin? Quelque chose comme ./lectures/chapter_10/images? Quelle est alors la bonne syntaxe?
aaragon
@aaragon Certes, cela fait longtemps que je n’ai pas utilisé Mercurial, mais vous auriez besoin d’ajuster la regex pour correspondre aux motifs que vous souhaitez. Lorsque vous remarquez des chemins que vous espérez ignorer, ajustez l'expression régulière si nécessaire.
Paul Redmond