f9b43535dda27f1ca575a01d127116e3ee1b4925
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)
38 os
.write(fd
, locked_by
)
41 lockfile
= os
.path
.join(dir, branch
.replace('/', '\/'))
43 os
.link(tmplock
, lockfile
)
51 # If the workdir has been deleted, break his lock
52 if os
.access(user
, os
.R_OK
):
53 raise YapError("That branch is being used by an existing workdir")
57 def cmd_workdir(self
, branch
, workdir
=None):
62 branches
= get_output("git for-each-ref --format='%(refname)' 'refs/heads'")
63 if 'refs/heads/%s' % branch
not in branches
:
64 raise YapError("Not a branch: %s" % branch
)
66 current
= get_output("git symbolic-ref HEAD")[0]
68 repo
= get_output('git rev-parse --git-dir')[0]
69 repo
= os
.path
.join(os
.getcwd(), repo
)
70 repodir
= os
.path
.dirname(repo
)
72 repoparent
, reponame
= os
.path
.split(repodir
)
73 workdir
= os
.path
.join(repoparent
, "%s-%s" % (reponame
, branch
))
75 # Make sure the current branch is locked
77 self
._lock
_branch
(current
.replace('refs/heads/', ''), repodir
)
81 self
._lock
_branch
(branch
, workdir
)
86 raise YapError("Can't create new workdir: %s (%s)" % (workdir
, e
))
92 for x
in ["config", "refs", "logs/refs", "objects", "info",
93 "hooks", "packed-refs", "remotes", "svn"]:
94 if os
.path
.dirname(x
):
95 os
.makedirs(os
.path
.dirname(x
))
96 os
.symlink(os
.path
.join(repo
, x
), x
)
98 run_safely("cp %s HEAD" % os
.path
.join(repo
, 'HEAD'))
100 run_safely("git symbolic-ref HEAD refs/heads/%s" % branch
)
101 self
.cmd_revert(**{'-a': 1})
103 print "Workdir created at %s for branch %s" % (workdir
, branch
)
105 def cmd_switch(self
, branch
, *args
, **flags
):
108 current
= get_output("git symbolic-ref HEAD")[0]
110 repo
= get_output('git rev-parse --git-dir')[0]
111 self
._lock
_branch
(branch
, repo
)
114 super(WorkdirPlugin
, self
).cmd_switch(branch
, *args
, **flags
)
116 self
._unlock
_branch
(branch
)
119 self
._unlock
_branch
(current
.replace('refs/heads/', ''))