Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Paste
P971
hg_args.php
Active
Public
Actions
Authored by
epriestley
on Nov 6 2013, 6:36 PM.
Edit Paste
Archive Paste
View Raw File
Subscribe
Mute Notifications
Flag For Later
Award Token
Tags
None
Referenced Files
F78882: hg_args.php
Nov 6 2013, 6:36 PM
2013-11-06 18:36:52 (UTC+0)
Subscribers
None
private
function
getMercurialArguments
()
{
// Mercurial sends arguments in HTTP headers. "Why?", you might wonder,
// "Why would you do this?".
$args_raw
=
array
();
for
(
$ii
=
1
;
;
$ii
++)
{
$header
=
'HTTP_X_HGARG_'
.
$ii
;
if
(!
array_key_exists
(
$header
,
$_SERVER
))
{
break
;
}
$args_raw
[]
=
$_SERVER
[
$header
];
}
$args_raw
=
implode
(
''
,
$args_raw
);
return
id
(
new
PhutilQueryStringParser
())
->
parseQueryString
(
$args_raw
);
}
private
function
formatMercurialArguments
(
$command
,
array
$arguments
)
{
$spec
=
$this
->
getMercurialCommandSpecification
(
$command
);
$out
=
array
();
// Mercurial takes normal arguments like this:
//
// name <length(value)>
// value
$has_star
=
false
;
foreach
(
$spec
as
$arg_key
)
{
if
(
$arg_key
==
'*'
)
{
$has_star
=
true
;
continue
;
}
if
(
isset
(
$arguments
[
$arg_key
]))
{
$value
=
$arguments
[
$arg_key
];
$size
=
strlen
(
$value
);
$out
[]
=
"{$arg_key} {$size}
\n
{$value}"
;
}
}
if
(
$has_star
)
{
// Mercurial takes arguments for variable argument lists roughly like
// this:
//
// * <count(args)>
// argname1 <length(argvalue1)>
// argvalue1
// argname2 <length(argvalue2)>
// argvalue2
$count
=
count
(
$arguments
);
$out
[]
=
"* {$count}
\n
"
;
foreach
(
$arguments
as
$key
=>
$value
)
{
if
(
in_array
(
$key
,
$spec
))
{
// We already added this argument above, so skip it.
continue
;
}
$size
=
strlen
(
$value
);
$out
[]
=
"{$key} {$size}
\n
{$value}"
;
}
}
$out
=
implode
(
''
,
$out
);
if
(
strlen
(
$out
))
{
$out
.=
"
\n
"
;
}
return
$out
;
}
private
function
getMercurialCommandSpecification
(
$command
)
{
// We need to enumerate all of the Mercurial wire commands because the
// argument encoding varies based on the command. "Why?", you might ask,
// "Why would you do this?".
$commands
=
array
(
'batch'
=>
array
(
'cmds'
,
'*'
),
'between'
=>
array
(
'pairs'
),
'branchmap'
=>
array
(),
'branches'
=>
array
(
'nodes'
),
'capabilities'
=>
array
(),
'changegroup'
=>
array
(
'roots'
),
'changegroupsubset'
=>
array
(
'bases heads'
),
'debugwireargs'
=>
array
(
'one two *'
),
'getbundle'
=>
array
(
'*'
),
'heads'
=>
array
(),
'hello'
=>
array
(),
'known'
=>
array
(
'nodes'
,
'*'
),
'listkeys'
=>
array
(
'namespace'
),
'lookup'
=>
array
(
'key'
),
'pushkey'
=>
array
(
'namespace'
,
'key'
,
'old'
,
'new'
),
'stream_out'
=>
array
(
''
),
'unbundle'
=>
array
(
'heads'
),
);
if
(!
isset
(
$commands
[
$command
]))
{
throw
new
Exception
(
"Unknown Mercurial command '{$command}!"
);
}
return
$commands
[
$command
];
}
Event Timeline
epriestley
edited the content of this paste.
(Show Details)
Nov 6 2013, 6:36 PM
2013-11-06 18:36:52 (UTC+0)
epriestley
changed the title of this paste from untitled to
hg_args.php
.
epriestley
updated the paste's language from
autodetect
to
autodetect
.
Log In to Comment