亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dependency-graph.in

?? linux下各種patch的管理工具
?? IN
字號:
#!@PERL@ -w#  This script is free software; you can redistribute it and/or modify#  it under the terms of the GNU General Public License version 2 as#  published by the Free Software Foundation.##  See the COPYING and AUTHORS files for more details.# Generate a dot-style graph of dependencies between patches.use Getopt::Long;use FileHandle;use strict;# Constantsmy $short_edge_style = "color=grey";my $close_node_style = "color=grey";my $highlighted_node_style = "style=bold";# Command line argumentsmy $help = 0;my $use_patcher = 0;		# Assume patcher format for metadatamy $short_edge_thresh = 0;	# threshold for coloring as "short", 0 = disablemy $long_edge_thresh = 0;	# threshold for coloring as "long",0 = disablemy $edge_labels;		# label all edges with filenamesmy $short_edge_labels;		# label short edges with filenamesmy $long_edge_labels;		# label long edges with filenamesmy $edge_length_labels;		# distance between patches as edge labelsmy $node_numbers;		# include sequence numbersmy $show_isolated_nodes;	# also include isolated nodesmy $reduce;			# remove transitive edgesmy $filter_patchnames;		# filter for compacting filenamesmy $selected_patch;		# only include patches related on this patchmy $selected_distance = -1;	# infinitymy @highlight_patches;		# a list of patches to highlightmy $lines;			# check ranges with this number of context				# lines.unless (GetOptions(	"h|help"		=> \$help,	"patcher"		=> \$use_patcher,	"short-edge=i"		=> \$short_edge_thresh,	"long-edge=i"		=> \$long_edge_thresh,	"edge-files"		=> \$edge_labels,	"short-edge-files"	=> \$short_edge_labels,	"long-edge-files"	=> \$long_edge_labels,	"edge-length"		=> \$edge_length_labels,	"node-numbers"		=> \$node_numbers,	"isolated"		=> \$show_isolated_nodes,	"reduce"		=> \$reduce,	"filter-patchnames=s"	=> \$filter_patchnames,	"select-patch=s"	=> \$selected_patch,	"select-distance=i"	=> \$selected_distance,	"highlight=s"		=> \@highlight_patches,	"lines=i"		=> \$lines) && !$help) {    my $basename = $0;    $basename =~ s:.*/::;    my $fd = $help ? *STDOUT : *STDERR;    print $fd <<EOF;SYNOPSIS: $basename [-h] [--patcher] [--short-edge=num] [--long-edge=num]	  [--short-edge-files] [--long-edge-files] [--edge-length]	  [--node-numbers] [--isolated] [--reduce] [--filter-patchnames=filter]	  [--select-patch=patch] [--select-distance=num] [--highlight=patch]	  [--lines=num]--patcher	Assume patch manager is Holger Schurig's patcher script instead	of the default quilt.--short-edge=num, --long-edge=num	Define the maximum edge length of short edges, and minimum edge	length of long edges. Short edges are de-emphasized, and long	edges are emphasized. The default is to treat all edges equally.-edge-files, --short-edge-files, --long-edge-files	Include conflicting filenames on all edges, short edges, or long	edges.--edge-length	Use the edge lengths as edge labels. Cannot be used together with	filename labels.--node-numbers	Include the sequence numbers of patches in the patch series in	node labels.--isolated	Do not suppress isolated nodes.--reduce	Remove transitive edges.--filter-patchnames=filter	Define a filter command for transforming patch names into node	labels. The filter is passed each patch name on a separate line,	and must return the edge label for each patch on a separate line	(example: sed -e 's/^prefix//').--select-patch=patch	Reduce the graph to nodes that depend on the specified patch,	and nodes that the specified patch depends on (recursively).--select-distance=num	Limit the depth of recusion for --select-patch. The default is	to recurse exhaustively.--highlight=patch	Highlight the specified patch. This option can be specified more	than once.--lines=num	Check the ranges of lines that the patches modify for computing	dependencies. Include up to num lines of context.EOF    exit $help ? 0 : 1;}my @nodes;sub next_patch_for_file($$){    my ($n, $file) = @_;    for (my $i = $n + 1; $i < @nodes; $i++) {	return $i	    if (exists $nodes[$i]{files}{$file});    }    return undef;}# Compute the ranges of lines that a patch modifies: The patch should# have no context lines. The return value is a list of pairs of line# numbers, alternatingly marking the start and end of a modification.sub ranges($) {    my ($fd) = @_;    my (@left, @right);    while (<$fd>) {	if (/^\@\@ -(\d+)(?:,(\d+)?) \+(\d+)(?:,(\d+)?) \@\@/) {	    push @left,  ($3, $3 + $4);	    push @right, ($1, $1 + $2);	}    }    return [ [ @left ], [ @right ] ];}sub backup_file_name($$) {    my ($patch, $file) = @_;    if ($use_patcher) {	return $file . "~" . $patch;    } else {	return $ENV{QUILT_PC} . "/" . $patch . "/" . $file;    }}# Compute the lists of lines that a patch changes in a file.sub compute_ranges($$) {    my ($n, $file) = @_;    my $file1 = backup_file_name($nodes[$n]{file}, $file);    my $file2;    my $n2 = next_patch_for_file($n, $file);    if (defined $n2) {	$file2 = backup_file_name($nodes[$n2]{file}, $file);    } else {	$file2 = $file;    }    #print STDERR "diff -U$lines \"$file1\" \"$file2\"\n";    if (-z $file1) {	$file1="/dev/null";	return [[], []]	    if (-z $file2);    } else {	$file2="/dev/null"	    if (-z $file2);    }    my $fd = new FileHandle("diff -U$lines \"$file1\" \"$file2\" |");    my $ranges = ranges($fd);    $fd->close();    return $ranges;}sub is_a_conflict($$$) {    my ($from, $to, $filename) = @_;    $nodes[$from]{files}{$filename} = compute_ranges($from, $filename)	unless @{$nodes[$from]{files}{$filename}};    $nodes[$to]{files}{$filename} = compute_ranges($to, $filename)	unless @{$nodes[$to]{files}{$filename}};    my @a = @{$nodes[$from]{files}{$filename}[1]};    my @b = @{$nodes[$to  ]{files}{$filename}[0]};    while (@a && @b) {	if ($a[0] < $b[0]) {	    return 1 if @b % 2;	    shift @a;	} elsif ($a[0] > $b[0]) {	    return 1 if @a % 2;	    shift @b;	} else {	    return 1 if (@a % 2) == (@b % 2);	    shift @a;	    shift @b;	}    }    return 0;}# Fetch the list of patches (all of them must be applied)my @patches;if (@ARGV) {	if (@ARGV == 1 && $ARGV[0] eq "-") {		@patches = map { chomp ; $_ } <STDIN>;	} else {		@patches = @ARGV;	}} elsif ($use_patcher) {	my $fh = new FileHandle("< .patches/applied")		or die ".patches/applied: $!\n";	@patches = map { chomp; $_ } <$fh>;	$fh->close();} else {	my $fh = new FileHandle("< $ENV{QUILT_PC}/applied-patches")		or die ".$ENV{QUILT_PC}/applied-patches: $!\n";	@patches = map { chomp; $_ } <$fh>;	$fh->close();}# Fetch the list of filesmy $n = 0;foreach my $patch (@patches) {	my @files;	if ($use_patcher) {		my $fh = new FileHandle("< .patches/$patch.files")			or die ".patches/$patch.files: $!\n";		@files = map { chomp; $_ } <$fh>;		$fh->close();	} else {		if (! -d "$ENV{QUILT_PC}/$patch") {			print STDERR "$ENV{QUILT_PC}/$patch does not exist; skipping\n";			next;		}		@files = split(/\n/, `cd $ENV{QUILT_PC}/$patch ; find . -type f ! -name .timestamp`);		@files = map { s:\./::; $_ } @files;	}	push @nodes, {number=>$n++, name=>$patch, file=>$patch,		files=>{ map {$_ => []} @files } };}my %used_nodes;		# nodes to which at least one edge is attached# If a patch is selected, limit the graph to nodes that depend on this patch,# and nodes that are dependent on this patch.if ($selected_patch) {    for ($n = 0; $n < @nodes; $n++) {	last if $nodes[$n]{file} eq $selected_patch;    }    die "Patch $selected_patch not included\n"	if ($n == @nodes);    $used_nodes{$n} = 1;    my $selected_node = $nodes[$n];    push @{$selected_node->{attrs}}, $highlighted_node_style;    my %sel;    map { $sel{$_} = 1 } keys %{$selected_node->{files}};    foreach my $node (@nodes) {	foreach my $file (keys %{$node->{files}}) {	    unless (exists $sel{$file}) {		delete $node->{files}{$file};	    }	}    }}# Optionally highlight a list of patchesforeach my $patch (@highlight_patches) {    for ($n = 0; $n < @nodes; $n++) {	last if $nodes[$n]{file} eq $patch;    }    die "Patch $patch not included\n"	if ($n == @nodes);    my $node = $nodes[$n];    push @{$node->{attrs}}, $highlighted_node_style;    $node->{colorized} = 1;}# If a patchname filter is selected, pipe all patchnames through# it.if ($filter_patchnames) {    local *PIPE;    my $pid = open(PIPE, "- |");  # fork a child to read from    die "fork: $!\n"    	unless defined $pid;    unless ($pid) {  # child	# open a second pipe to the actual filter	open(PIPE, "| $filter_patchnames")	    or die "$filter_patchnames: $!\n";	map { print PIPE "$_\n" } @patches;	close(PIPE);	exit;    } else { # parent	$n = 0;	foreach my $name (<PIPE>) {	    last unless $n < @nodes;	    chomp $name;	    if ($name eq "") {		delete $nodes[$n++]{name};	    } else {		$nodes[$n++]{name} = $name;	    }	}	close(PIPE)	    or die "patchname filter failed.\n";	die "patchname filter returned too few lines\n"	    if $n != @nodes;    }}my %files_seen;		# remember the last patch that touched each filemy %edges;foreach my $node (@nodes) {    my $number = $node->{number};    foreach my $file (keys %{$node->{files}}) {	if (exists $files_seen{$file}) {	    my $patches = $files_seen{$file};	    my $patch;	    # Optionally look at the line ranges the patches touch	    if (defined $lines) {		for (my $n = $#$patches; $n >= 0; $n--) {		    if (is_a_conflict($number, $patches->[$n], $file)) {			$patch = $patches->[$n];			last;		    }		}	    } else {		$patch = $patches->[$#$patches];	    }	    if (defined $patch) {		push @{$edges{"$number:$patch"}{names}}, $file;		$used_nodes{$number} = 1;		$used_nodes{$patch} = 1;	    }	}	push @{$files_seen{$file}}, $number;    }}# Create adjacency listsforeach my $node (@nodes) {    @{$node->{to}} = ();    @{$node->{from}} = ();}foreach my $key (keys %edges) {    my ($from, $to) = split /:/, $key;    push @{$nodes[$from]{to}}, $to;    push @{$nodes[$to]{from}}, $from;}# Colorize nodes that are close to each otherforeach my $node (@nodes) {    if (!exists $node->{colorized} && !exists $used_nodes{$node->{number}}) {	$node->{colorized} = 1;	push @{$node->{attrs}}, $close_node_style;    }}# Colorize short and long edgesforeach my $node (@nodes) {    my $close = 1;    foreach my $node2 (map {$nodes[$_]} @{$node->{to}}) {	if (abs($node2->{number} - $node->{number}) > $short_edge_thresh) {	    $close = 0	}    }    foreach my $node2 (map {$nodes[$_]} @{$node->{from}}) {	if (abs($node2->{number} - $node->{number}) > $short_edge_thresh) {	    $close = 0	}    }    if (!exists $node->{colorized} && $close) {	$node->{colorized} = 1;	push @{$node->{attrs}}, $close_node_style;    }}# Add node labelsforeach my $node (@nodes) {    my @label = ();    push @label, $node->{number} + 1	if ($node_numbers);    push @label, $node->{name}	if exists $node->{name};    push @{$node->{attrs}}, "label=\"" . join(": ", @label) . "\"";}# Add edge labelsforeach my $key (keys %edges) {    my ($from, $to) = split /:/, $key;    if ($edge_length_labels) {	push @{$edges{$key}->{attrs}}, "label=\"" . abs($to - $from) . "\""	    if abs($to - $from) > 1;    } elsif (abs($to - $from) < $short_edge_thresh) {	push @{$edges{$key}->{attrs}}, $short_edge_style;	if ($edge_labels || $short_edge_labels) {	    push @{$edges{$key}->{attrs}},		"label=\"" . join("\\n", @{$edges{$key}{names}}) . "\"";	}    } else {	if ($long_edge_thresh && abs($to - $from) > $long_edge_thresh) {	    push @{$edges{$key}->{attrs}}, "style=bold";	    if ($edge_labels || $long_edge_labels) {		push @{$edges{$key}->{attrs}},		    "label=\"" . join("\\n", @{$edges{$key}{names}}) . "\"";	    }	} else {	    if ($edge_labels) {		push @{$edges{$key}->{attrs}},		    "label=\"" . join("\\n", @{$edges{$key}{names}}) . "\"";	    }	}    }    # Compute a pseudo edge length so that neato works acceptably.    push @{$edges{$key}{attrs}}, "len=\"" .    	sprintf("%.2f", log(abs($to - $from) + 3)) . "\"";}#foreach my $node (@nodes) {#    push @{$node->{attrs}}, "shape=box";#}# Open output file / pipemy $out;if ($reduce) {    $out = new FileHandle("| tred")	or die "tred: $!\n";} else {    $out = new FileHandle("> /dev/stdout")	or die "$!\n";}# Write graphprint $out "digraph dependencies {\n";#print "\tsize=\"11,8\"\n";foreach my $node (@nodes) {    next unless $show_isolated_nodes || exists $used_nodes{$node->{number}};    print $out "\tn$node->{number}";    if (exists $node->{attrs}) {	print $out " [" .	      join(",", @{$node->{attrs}}) . "]";    }    print $out ";\n";}sub w($) {    my @n = split /:/, shift;    return $n[0] * 10000 + $n[1];}foreach my $key (sort { w($a) <=> w($b) } keys %edges) {    my ($from, $to) = split /:/, $key;    print $out "\tn$to -> n$from";    if (exists $edges{$key}{attrs}) {	print $out " [" . join(",", @{$edges{$key}{attrs}}) . "]";    }    print $out ";\n";}print $out "}\n";

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
风间由美一区二区三区在线观看| 欧美不卡在线视频| 制服.丝袜.亚洲.另类.中文| 久久精品视频一区| 亚洲五码中文字幕| 99亚偷拍自图区亚洲| 久久亚洲欧美国产精品乐播| 亚洲综合清纯丝袜自拍| 成人免费高清在线| 久久综合狠狠综合久久综合88 | 欧美日韩免费视频| 欧美高清在线视频| 狠狠色狠狠色合久久伊人| 欧美二区三区的天堂| 一区二区在线免费| 99re热这里只有精品视频| 久久久久久影视| 久久 天天综合| 日韩一级二级三级精品视频| 亚洲一区免费观看| 色噜噜狠狠成人中文综合 | 一区二区三区日韩欧美| 色婷婷激情综合| 国产精品久久三区| 国产激情一区二区三区四区| 欧美电影免费观看高清完整版在线观看| 亚洲女爱视频在线| 91色综合久久久久婷婷| 综合色天天鬼久久鬼色| a美女胸又www黄视频久久| 国产欧美一区在线| 成人综合婷婷国产精品久久蜜臀 | 欧美日韩精品欧美日韩精品一| 日韩美女久久久| 一本一道综合狠狠老| 亚洲欧美日韩在线| 欧美四级电影网| 视频一区欧美精品| 欧美一卡2卡三卡4卡5免费| 日本不卡视频在线| 精品久久久久久久久久久久久久久 | 麻豆久久一区二区| 国产91色综合久久免费分享| 日韩欧美三级在线| 麻豆传媒一区二区三区| 亚洲精品一区二区三区精华液| 久久电影国产免费久久电影| 精品国产污网站| 国产成人啪免费观看软件| 国产精品成人午夜| 欧美伊人久久久久久久久影院| 一级中文字幕一区二区| 日韩一区二区三区在线观看| 麻豆国产精品一区二区三区| 久久嫩草精品久久久久| 欧美成人午夜电影| 成人福利视频网站| 一区二区三区国产豹纹内裤在线| 欧美色精品在线视频| 国产一区二三区好的| 亚洲少妇最新在线视频| 欧美日韩黄色影视| 国产精品1024| 亚洲久草在线视频| 精品国产乱码久久久久久影片| 处破女av一区二区| 性久久久久久久久| 久久老女人爱爱| 欧美在线色视频| 狠狠色丁香久久婷婷综| 亚洲男同性视频| 欧美精品一区二区三区一线天视频| 国产成人鲁色资源国产91色综| 玉足女爽爽91| 久久久久久9999| 欧美日韩视频一区二区| 高清视频一区二区| 麻豆精品蜜桃视频网站| 中文字幕中文字幕在线一区 | 欧美一级理论片| 成人三级伦理片| 热久久国产精品| 亚洲免费观看高清完整版在线观看| 91精品久久久久久久99蜜桃 | 久久久九九九九| 欧美久久久久久蜜桃| av一区二区三区| 国产美女娇喘av呻吟久久| 亚洲成人免费在线| 亚洲免费成人av| 国产欧美日韩亚州综合 | 国产精品乱人伦| 日韩精品一区二区在线| 在线亚洲一区二区| 东方aⅴ免费观看久久av| 蜜臀久久久久久久| 亚洲香肠在线观看| 一区二区中文字幕在线| 国产亚洲一区二区三区在线观看| 欧美一区二区三区免费在线看| 91色九色蝌蚪| av欧美精品.com| 高清不卡一区二区| 国产成人夜色高潮福利影视| 免费欧美高清视频| 亚洲一区在线免费观看| 亚洲欧美日韩成人高清在线一区| 亚洲国产精品t66y| 中文字幕免费不卡| 欧美国产综合色视频| 亚洲国产激情av| 欧美国产成人精品| 中文字幕一区视频| 国产精品久久久久久久久搜平片 | 亚洲日本青草视频在线怡红院| 久久九九国产精品| 国产人伦精品一区二区| 国产喂奶挤奶一区二区三区| 久久久91精品国产一区二区精品| 久久久久久久久蜜桃| 久久夜色精品国产欧美乱极品| 日韩午夜电影在线观看| 欧美刺激脚交jootjob| 日韩精品专区在线影院重磅| 欧美电视剧免费观看| 日韩精品一区二区三区四区视频| 日韩你懂的在线观看| 久久久久久一二三区| 欧美极品xxx| 亚洲日本va午夜在线电影| 一区二区三区在线观看欧美| 亚洲成va人在线观看| 免费在线观看一区| 国内精品免费在线观看| 99riav一区二区三区| 欧洲av在线精品| 欧美一区二区成人6969| 久久久精品综合| 一区二区三区中文在线| 男女性色大片免费观看一区二区| 久久99精品久久久久| 大白屁股一区二区视频| 欧美日韩亚洲丝袜制服| 精品国产亚洲一区二区三区在线观看| 亚洲国产激情av| 亚洲不卡在线观看| 国产乱子轮精品视频| 99国产精品久久久| 日韩一区二区三| 国产精品美女久久久久久| 午夜视黄欧洲亚洲| 国产精品一二一区| 欧美日韩小视频| 国产拍欧美日韩视频二区| 亚洲电影一区二区三区| 久久精品国产免费看久久精品| 高清成人免费视频| 欧美一区二区三区在| 国产精品―色哟哟| 免费成人av在线| 91美女片黄在线观看91美女| 欧美大片拔萝卜| 一区二区在线电影| 成人综合在线观看| 日韩欧美精品三级| 一区二区三区视频在线看| 精品一区二区在线视频| 在线影院国内精品| 国产欧美日产一区| 久久精品国产免费| 欧美日韩视频在线一区二区| 国产精品午夜在线| 精品一区二区三区免费观看| 色综合久久综合| 久久精品日韩一区二区三区| 午夜久久久影院| 色8久久人人97超碰香蕉987| 亚洲精品一区二区三区影院 | 欧美久久免费观看| 自拍偷拍欧美精品| 国产福利一区二区三区在线视频| 欧美精选午夜久久久乱码6080| 日韩成人av影视| 欧美日韩国产首页在线观看| 国产精品初高中害羞小美女文| 国产精品66部| 日韩免费看网站| 日本欧美在线观看| 91精品国产色综合久久不卡电影| 亚洲精品成人a在线观看| 波多野洁衣一区| 欧美韩国一区二区| 高清在线不卡av| 国产精品你懂的在线欣赏| 懂色av中文一区二区三区| 26uuu欧美| 精品一区二区三区在线观看 | 一区二区三区中文免费| 91丨九色丨尤物| 夜夜亚洲天天久久|