2 from yap
.yap
import YapCore
, YapError
3 from yap
.util
import get_output
, takes_options
, run_safely
8 class WorkdirPlugin(YapCore
):
9 "Create extra work directories of a repository"
11 def __init__(self
, *args
, **flags
):
12 super(WorkdirPlugin
, self
).__init
__(*args
, **flags
)
14 def _unlock_branch(self
, branch
):
15 repo
= get_output('git rev-parse --git-dir')[0]
16 dir = os
.path
.join(repo
, 'yap', 'lock')
22 lockfile
= os
.path
.join(dir, branch
.replace('/', '\/'))
29 def _lock_branch(self
, branch
, locked_by
):
30 repo
= get_output('git rev-parse --git-dir')[0]
31 dir = os
.path
.join(repo
, 'yap', 'lock')
37 fd
, tmplock
= tempfile
.mkstemp("yap", dir=dir)
39 os
.write(fd
, locked_by
)
42 lockfile
= os
.path
.join(dir, branch
.replace('/', '\/'))
44 os
.link(tmplock
, lockfile
)
52 # If the workdir has been deleted, break his lock
53 if os
.access(user
, os
.R_OK
):
54 raise YapError("That branch is being used by an existing workdir")
60 def _get_repodir(self
):
61 repo
= get_output('git rev-parse --git-dir')[0]
62 if not repo
.startswith('/'):
63 repo
= os
.path
.join(os
.getcwd(), repo
)
64 repodir
= os
.path
.dirname(repo
)
67 def cmd_workdir(self
, branch
, workdir
=None):
72 branches
= get_output("git for-each-ref --format='%(refname)' 'refs/heads'")
73 if 'refs/heads/%s' % branch
not in branches
:
74 raise YapError("Not a branch: %s" % branch
)
76 current
= get_output("git symbolic-ref HEAD")[0]
77 repodir
= self
._get
_repodir
()
78 repo
= os
.path
.join(repodir
, '.git')
80 repoparent
, reponame
= os
.path
.split(repodir
)
81 workdir
= os
.path
.join(repoparent
, "%s-%s" % (reponame
, branch
))
83 # Make sure the current branch is locked
85 self
._lock
_branch
(current
.replace('refs/heads/', ''), repodir
)
89 self
._lock
_branch
(branch
, workdir
)
94 raise YapError("Can't create new workdir: %s (%s)" % (workdir
, e
))
100 for x
in ["config", "refs", "logs/refs", "objects", "info",
101 "hooks", "packed-refs", "remotes", "yap", "svn"]:
102 if os
.path
.dirname(x
):
103 os
.makedirs(os
.path
.dirname(x
))
104 os
.symlink(os
.path
.join(repo
, x
), x
)
106 run_safely("cp %s HEAD" % os
.path
.join(repo
, 'HEAD'))
108 run_safely("git symbolic-ref HEAD refs/heads/%s" % branch
)
109 self
.cmd_revert(**{'-a': 1})
111 print "Workdir created at %s for branch %s" % (workdir
, branch
)
113 def cmd_branch(self
, *args
, **flags
):
116 repodir
= self
._get
_repodir
()
117 self
._lock
_branch
(branch
, repodir
)
122 super(WorkdirPlugin
, self
).cmd_branch(*args
, **flags
)
125 self
._unlock
_branch
(branch
)
127 def cmd_switch(self
, branch
, *args
, **flags
):
130 current
= get_output("git symbolic-ref HEAD")[0]
132 repodir
= self
._get
_repodir
()
133 self
._lock
_branch
(branch
, repodir
)
136 super(WorkdirPlugin
, self
).cmd_switch(branch
, *args
, **flags
)
138 self
._unlock
_branch
(branch
)
141 self
._unlock
_branch
(current
.replace('refs/heads/', ''))