Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
git
提交
4f5cf76a
G
git
项目概览
李少辉-开发者
/
git
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
git
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4f5cf76a
编写于
3月 19, 2007
作者:
S
Simon Hausmann
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
First (untested) attempt at migrating p4-git-sync into the final git-p4 script
Signed-off-by:
N
Simon Hausmann
<
hausmann@kde.org
>
上级
c8c39116
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
240 addition
and
3 deletion
+240
-3
contrib/fast-import/git-p4.py
contrib/fast-import/git-p4.py
+240
-3
未找到文件。
contrib/fast-import/git-p4.py
浏览文件 @
4f5cf76a
...
...
@@ -6,7 +6,10 @@
# License: MIT <http://www.opensource.org/licenses/mit-license.php>
#
import
optparse
,
sys
,
os
,
marshal
,
popen2
import
optparse
,
sys
,
os
,
marshal
,
popen2
,
shelve
import
tempfile
gitdir
=
os
.
environ
.
get
(
"GIT_DIR"
,
""
)
def
p4CmdList
(
cmd
):
cmd
=
"p4 -G %s"
%
cmd
...
...
@@ -37,6 +40,15 @@ def die(msg):
def
currentGitBranch
():
return
os
.
popen
(
"git-name-rev HEAD"
).
read
().
split
(
" "
)[
1
][:
-
1
]
def
isValidGitDir
(
path
):
if
os
.
path
.
exists
(
path
+
"/HEAD"
)
and
os
.
path
.
exists
(
path
+
"/refs"
)
and
os
.
path
.
exists
(
path
+
"/objects"
):
return
True
;
return
False
def
system
(
cmd
):
if
os
.
system
(
cmd
)
!=
0
:
die
(
"command failed: %s"
%
cmd
)
class
P4Debug
:
def
__init__
(
self
):
self
.
options
=
[
...
...
@@ -83,6 +95,214 @@ def run(self, args):
print
"%s tags removed."
%
len
(
allTags
)
class
P4Sync
:
def
__init__
(
self
):
self
.
options
=
[
optparse
.
make_option
(
"--continue"
,
action
=
"store_false"
,
dest
=
"firstTime"
),
optparse
.
make_option
(
"--origin"
,
dest
=
"origin"
),
optparse
.
make_option
(
"--reset"
,
action
=
"store_true"
,
dest
=
"reset"
),
optparse
.
make_option
(
"--master"
,
dest
=
"master"
),
optparse
.
make_option
(
"--log-substitutions"
,
dest
=
"substFile"
),
optparse
.
make_option
(
"--noninteractive"
,
action
=
"store_false"
),
optparse
.
make_option
(
"--dry-run"
,
action
=
"store_true"
)
]
self
.
description
=
"Submit changes from git to the perforce depot."
self
.
firstTime
=
True
self
.
reset
=
False
self
.
interactive
=
True
self
.
dryRun
=
False
self
.
substFile
=
""
self
.
firstTime
=
True
self
.
origin
=
"origin"
self
.
master
=
""
self
.
logSubstitutions
=
{}
self
.
logSubstitutions
[
"<enter description here>"
]
=
"%log%"
self
.
logSubstitutions
[
"
\t
Details:"
]
=
"
\t
Details: %log%"
def
check
(
self
):
if
len
(
p4CmdList
(
"opened ..."
))
>
0
:
die
(
"You have files opened with perforce! Close them before starting the sync."
)
def
start
(
self
):
if
len
(
self
.
config
)
>
0
and
not
self
.
reset
:
die
(
"Cannot start sync. Previous sync config found at %s"
%
self
.
configFile
)
commits
=
[]
for
line
in
os
.
popen
(
"git-rev-list --no-merges %s..%s"
%
(
self
.
origin
,
self
.
master
)).
readlines
():
commits
.
append
(
line
[:
-
1
])
commits
.
reverse
()
self
.
config
[
"commits"
]
=
commits
print
"Creating temporary p4-sync branch from %s ..."
%
self
.
origin
system
(
"git checkout -f -b p4-sync %s"
%
self
.
origin
)
def
prepareLogMessage
(
self
,
template
,
message
):
result
=
""
for
line
in
template
.
split
(
"
\n
"
):
if
line
.
startswith
(
"#"
):
result
+=
line
+
"
\n
"
continue
substituted
=
False
for
key
in
self
.
logSubstitutions
.
keys
():
if
line
.
find
(
key
)
!=
-
1
:
value
=
self
.
logSubstitutions
[
key
]
value
=
value
.
replace
(
"%log%"
,
message
)
if
value
!=
"@remove@"
:
result
+=
line
.
replace
(
key
,
value
)
+
"
\n
"
substituted
=
True
break
if
not
substituted
:
result
+=
line
+
"
\n
"
return
result
def
apply
(
self
,
id
):
print
"Applying %s"
%
(
os
.
popen
(
"git-log --max-count=1 --pretty=oneline %s"
%
id
).
read
())
diff
=
os
.
popen
(
"git diff-tree -r --name-status
\"
%s^
\"
\"
%s
\"
"
%
(
id
,
id
)).
readlines
()
filesToAdd
=
set
()
filesToDelete
=
set
()
for
line
in
diff
:
modifier
=
line
[
0
]
path
=
line
[
1
:].
strip
()
if
modifier
==
"M"
:
system
(
"p4 edit %s"
%
path
)
elif
modifier
==
"A"
:
filesToAdd
.
add
(
path
)
if
path
in
filesToDelete
:
filesToDelete
.
remove
(
path
)
elif
modifier
==
"D"
:
filesToDelete
.
add
(
path
)
if
path
in
filesToAdd
:
filesToAdd
.
remove
(
path
)
else
:
die
(
"unknown modifier %s for %s"
%
(
modifier
,
path
))
system
(
"git-diff-files --name-only -z | git-update-index --remove -z --stdin"
)
system
(
"git cherry-pick --no-commit
\"
%s
\"
"
%
id
)
for
f
in
filesToAdd
:
system
(
"p4 add %s"
%
f
)
for
f
in
filesToDelete
:
system
(
"p4 revert %s"
%
f
)
system
(
"p4 delete %s"
%
f
)
logMessage
=
""
foundTitle
=
False
for
log
in
os
.
popen
(
"git-cat-file commit %s"
%
id
).
readlines
():
if
not
foundTitle
:
if
len
(
log
)
==
1
:
foundTitle
=
1
continue
if
len
(
logMessage
)
>
0
:
logMessage
+=
"
\t
"
logMessage
+=
log
template
=
os
.
popen
(
"p4 change -o"
).
read
()
if
self
.
interactive
:
submitTemplate
=
self
.
prepareLogMessage
(
template
,
logMessage
)
diff
=
os
.
popen
(
"p4 diff -du ..."
).
read
()
for
newFile
in
filesToAdd
:
diff
+=
"==== new file ====
\n
"
diff
+=
"--- /dev/null
\n
"
diff
+=
"+++ %s
\n
"
%
newFile
f
=
open
(
newFile
,
"r"
)
for
line
in
f
.
readlines
():
diff
+=
"+"
+
line
f
.
close
()
pipe
=
os
.
popen
(
"less"
,
"w"
)
pipe
.
write
(
submitTemplate
+
diff
)
pipe
.
close
()
response
=
"e"
while
response
==
"e"
:
response
=
raw_input
(
"Do you want to submit this change (y/e/n)? "
)
if
response
==
"e"
:
[
handle
,
fileName
]
=
tempfile
.
mkstemp
()
tmpFile
=
os
.
fdopen
(
handle
,
"w+"
)
tmpFile
.
write
(
submitTemplate
)
tmpFile
.
close
()
editor
=
os
.
environ
.
get
(
"EDITOR"
,
"vi"
)
system
(
editor
+
" "
+
fileName
)
tmpFile
=
open
(
fileName
,
"r"
)
submitTemplate
=
tmpFile
.
read
()
tmpFile
.
close
()
os
.
remove
(
fileName
)
if
response
==
"y"
or
response
==
"yes"
:
if
self
.
dryRun
:
print
submitTemplate
raw_input
(
"Press return to continue..."
)
else
:
pipe
=
os
.
popen
(
"p4 submit -i"
,
"w"
)
pipe
.
write
(
submitTemplate
)
pipe
.
close
()
else
:
print
"Not submitting!"
self
.
interactive
=
False
else
:
fileName
=
"submit.txt"
file
=
open
(
fileName
,
"w+"
)
file
.
write
(
self
.
prepareLogMessage
(
template
,
logMessage
))
file
.
close
()
print
"Perforce submit template written as %s. Please review/edit and then use p4 submit -i < %s to submit directly!"
%
(
fileName
,
fileName
)
def
run
(
self
,
args
):
if
self
.
reset
:
self
.
firstTime
=
True
if
len
(
self
.
substFile
)
>
0
:
for
line
in
open
(
self
.
substFile
,
"r"
).
readlines
():
tokens
=
line
[:
-
1
].
split
(
"="
)
self
.
logSubstitutions
[
tokens
[
0
]]
=
tokens
[
1
]
if
len
(
self
.
master
)
==
0
:
self
.
master
=
currentGitBranch
()
if
len
(
self
.
master
)
==
0
or
not
os
.
path
.
exists
(
"%s/refs/heads/%s"
%
(
gitdir
,
self
.
master
)):
die
(
"Detecting current git branch failed!"
)
self
.
check
()
self
.
configFile
=
gitdir
+
"/p4-git-sync.cfg"
self
.
config
=
shelve
.
open
(
self
.
configFile
,
writeback
=
True
)
if
self
.
firstTime
:
self
.
start
()
commits
=
self
.
config
.
get
(
"commits"
,
[])
while
len
(
commits
)
>
0
:
self
.
firstTime
=
False
commit
=
commits
[
0
]
commits
=
commits
[
1
:]
self
.
config
[
"commits"
]
=
commits
self
.
apply
(
commit
)
if
not
self
.
interactive
:
break
self
.
config
.
close
()
if
len
(
commits
)
==
0
:
if
self
.
firstTime
:
print
"No changes found to apply between %s and current HEAD"
%
self
.
origin
else
:
print
"All changes applied!"
print
"Deleting temporary p4-sync branch and going back to %s"
%
self
.
master
system
(
"git checkout %s"
%
self
.
master
)
system
(
"git branch -D p4-sync"
)
print
"Cleaning out your perforce checkout by doing p4 edit ... ; p4 revert ..."
system
(
"p4 edit ... >/dev/null"
)
system
(
"p4 revert ... >/dev/null"
)
os
.
remove
(
self
.
configFile
)
def
printUsage
(
commands
):
print
"usage: %s <command> [options]"
%
sys
.
argv
[
0
]
print
""
...
...
@@ -93,7 +313,8 @@ def printUsage(commands):
commands
=
{
"debug"
:
P4Debug
(),
"clean-tags"
:
P4CleanTags
()
"clean-tags"
:
P4CleanTags
(),
"sync-to-perforce"
:
P4Sync
()
}
if
len
(
sys
.
argv
[
1
:])
==
0
:
...
...
@@ -110,9 +331,25 @@ def printUsage(commands):
printUsage
(
commands
.
keys
())
sys
.
exit
(
2
)
parser
=
optparse
.
OptionParser
(
"usage: %prog "
+
cmdName
+
" [options]"
,
cmd
.
options
,
options
=
cmd
.
options
cmd
.
gitdir
=
gitdir
options
.
append
(
optparse
.
make_option
(
"--git-dir"
,
dest
=
"gitdir"
))
parser
=
optparse
.
OptionParser
(
"usage: %prog "
+
cmdName
+
" [options]"
,
options
,
description
=
cmd
.
description
)
(
cmd
,
args
)
=
parser
.
parse_args
(
sys
.
argv
[
2
:],
cmd
);
gitdir
=
cmd
.
gitdir
if
len
(
gitdir
)
==
0
:
gitdir
=
".git"
if
not
isValidGitDir
(
gitdir
):
if
isValidGitDir
(
gitdir
+
"/.git"
):
gitdir
+=
"/.git"
else
:
dir
(
"fatal: cannot locate git repository at %s"
%
gitdir
)
os
.
environ
[
"GIT_DIR"
]
=
gitdir
cmd
.
run
(
args
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录