📄 merge_bug.aspx
字号:
<%@ Page language="C#"%>
<!--
Copyright 2002-2005 Corey Trager
Distributed under the terms of the GNU General Public License
-->
<!-- #include file = "inc.aspx" -->
<script language="C#" runat="server">
String sql;
DbUtil dbutil;
Security security;
DataRow dr;
///////////////////////////////////////////////////////////////////////
void Page_Load(Object sender, EventArgs e)
{
Util.do_not_cache(Response);
dbutil = new DbUtil();
security = new Security();
if (Util.get_setting("AllowBugMergingForNonAdmins","0") == "1")
{
security.check_security(dbutil, Request, Response, Security.ANY_USER_OK_EXCEPT_GUEST);
}
else
{
security.check_security(dbutil, Request, Response, Security.MUST_BE_ADMIN);
}
title.InnerText = Util.get_setting("AppTitle","BugTracker.NET") + " - "
+ "merge " + Util.get_setting("SingularBugLabel","bug");
if (!IsPostBack)
{
string orig_id_string = Request.QueryString["id"];
orig_id.Value = orig_id_string;
back_href.HRef = "edit_bug.aspx?id=" + orig_id_string;
from_bug.Value = orig_id_string;
}
else {
from_err.InnerText = "";
into_err.InnerText = "";
}
}
void Page_Unload(Object sender, EventArgs e)
{
if (dbutil != null) {dbutil.close();}
}
bool validate()
{
bool good = true;
// validate FROM
if (from_bug.Value == "")
{
from_err.InnerText = "\"From\" bug is required.";
good = false;
}
else {
if (!Util.is_int(from_bug.Value))
{
from_err.InnerText = "\"From\" bug must be an integer.";
good = false;
}
}
// validate INTO
if (into_bug.Value == "")
{
into_err.InnerText = "\"Into\" bug is required.";
good = false;
}
else {
if (!Util.is_int(into_bug.Value))
{
into_err.InnerText = "\"Into\" bug must be an integer.";
good = false;
}
}
if (!good)
{
return false;
}
if (from_bug.Value == into_bug.Value)
{
from_err.InnerText = "\"From\" bug cannot be the same as \"Into\" bug.";
return false;
}
// Continue and see if from and to exist in db
sql = @"
declare @from_desc varchar(100)
declare @into_desc varchar(100)
declare @from_id int
declare @into_id int
set @from_id = -1
set @into_id = -1
select @from_desc = bg_short_desc, @from_id = bg_id from bugs where bg_id = $from
select @into_desc = bg_short_desc, @into_id = bg_id from bugs where bg_id = $into
select @from_desc, @into_desc, @from_id, @into_id ";
sql = sql.Replace("$from", from_bug.Value);
sql = sql.Replace("$into", into_bug.Value);
dr = dbutil.get_datarow(sql);
if ((int) dr[2] == -1)
{
from_err.InnerText = "\"From\" bug not found.";
good = false;
}
if ((int) dr[3] == -1)
{
into_err.InnerText = "\"Into\" bug not found.";
good = false;
}
if (!good)
{
return false;
}
else
{
return true;
}
}
///////////////////////////////////////////////////////////////////////
void on_update(object Source, EventArgs e)
{
// does it say "Merge" or "Confirm Merge"?
if (submit.Value == "Merge")
{
if (!validate())
{
prev_from_bug.Value = "";
prev_into_bug.Value = "";
return;
}
}
if (prev_from_bug.Value == from_bug.Value
&& prev_into_bug.Value == into_bug.Value)
{
// rename the attachments
string upload_folder = Util.get_setting("UploadFolder","c:\\");
sql = @"select ba_id, ba_file from bug_attachments where ba_bug = $from";
sql = sql.Replace("$from", prev_from_bug.Value);
DataSet ds = dbutil.get_dataset(sql);
foreach (DataRow dr in ds.Tables[0].Rows)
{
// create path
StringBuilder path = new StringBuilder(upload_folder);
path.Append("\\");
path.Append(prev_from_bug.Value);
path.Append("_");
path.Append(Convert.ToString(dr["ba_id"]));
path.Append("_");
path.Append(Convert.ToString(dr["ba_file"]));
if (System.IO.File.Exists(path.ToString()))
{
StringBuilder path2 = new StringBuilder(upload_folder);
path2.Append("\\");
path2.Append(prev_into_bug.Value);
path2.Append("_");
path2.Append(Convert.ToString(dr["ba_id"]));
path2.Append("_");
path2.Append(Convert.ToString(dr["ba_file"]));
System.IO.File.Move(path.ToString(), path2.ToString());
}
}
// copy the from db entries to the to
sql = @"
insert into bug_comments
(bc_bug, bc_user, bc_date, bc_comment, bc_email_from, bc_email_to, bc_type)
select $into, bc_user, bc_date, bc_comment, bc_email_from, bc_email_to, bc_type
from bug_comments
where bc_bug = $from
insert into bug_subscriptions
(bs_bug, bs_user)
select $into, bs_user
from bug_subscriptions
where bs_bug = $from
and bs_user not in (select bs_user from bug_subscriptions where bs_bug = $into)
update bug_attachments
set ba_bug = $into
where ba_bug = $from";
sql = sql.Replace("$from",prev_from_bug.Value);
sql = sql.Replace("$into",prev_into_bug.Value);
dbutil.execute_nonquery(sql);
// record the merge itself
sql = @"insert into bug_comments
(bc_bug, bc_user, bc_date, bc_type, bc_comment)
values($into,$us,getdate(), 'comment', 'merged bug $from into this bug:')
select @@IDENTITY";
sql = sql.Replace("$from",prev_from_bug.Value);
sql = sql.Replace("$into",prev_into_bug.Value);
sql = sql.Replace("$us",Convert.ToString(security.this_usid));
int comment_id = Convert.ToInt32(dbutil.execute_scalar(sql));
// update bug comments with info from old bug
sql = @"update bug_comments
set bc_comment = convert(nvarchar,bc_comment) + char(10) + bg_short_desc
from bugs where bg_id = $from
and bc_id = $bc";
sql = sql.Replace("$from",prev_from_bug.Value);
sql = sql.Replace("$bc",Convert.ToString(comment_id));
dbutil.execute_nonquery(sql);
// delete the from bug
Util.delete_bug(dbutil, Convert.ToInt32(prev_from_bug.Value));
Response.Redirect ("edit_bug.aspx?id=" + prev_into_bug.Value);
}
else
{
prev_from_bug.Value = from_bug.Value;
prev_into_bug.Value = into_bug.Value;
static_from_bug.InnerText = from_bug.Value;
static_into_bug.InnerText = into_bug.Value;
static_from_desc.InnerText = (string)dr[0];
static_into_desc.InnerText = (string)dr[1];
from_bug.Style["display"] = "none";
into_bug.Style["display"] = "none";
static_from_bug.Style["display"] = "";
static_into_bug.Style["display"] = "";
static_from_desc.Style["display"] = "";
static_into_desc.Style["display"] = "";
submit.Value = "Confirm Merge";
}
}
</script>
<html>
<head>
<title id="title" runat="server">btnet merge bug</title>
<link rel="StyleSheet" href="btnet.css" type="text/css">
</head>
<body>
<% security.write_menu(Response, "admin"); %>
<p>
<div class=align><table border=0><tr><td>
<a id="back_href" runat="server" href="">back to <% Response.Write(Util.get_setting("SingularBugLabel","bug")); %></a>
<!--<a id="confirm_href" runat="server" href="">confirm delete</a>
</a>-->
<p>
Merge all comments, attachments, and subscriptions
from "FROM" <% Response.Write(Util.get_setting("SingularBugLabel","bug")); %>
into "INTO" <% Response.Write(Util.get_setting("SingularBugLabel","bug")); %>.
<br>
<span class=err>Note: "FROM" <% Response.Write(Util.get_setting("SingularBugLabel","bug")); %> will be deleted!</err>
<p>
<form runat="server" class=frm>
<table border=0>
<tr>
<td class=lbl align=right>
FROM <% Response.Write(Util.get_setting("SingularBugLabel","bug")); %>:
<td align=left valign=bottom>
<input type=text id="from_bug" runat="server" size=8>
<span class=static id="static_from_bug" runat="server" style='display: none;'></span>
<br>
<span class=static id="static_from_desc" runat="server" style='display: none;'></span>
<tr><td colspan=2><span class=err id="from_err" runat="server"> </span>
<tr>
<td class=lbl align=right>
INTO <% Response.Write(Util.get_setting("SingularBugLabel","bug")); %>:
<td align=left valign=bottom>
<input type=text id="into_bug" runat="server" size=8>
<span class=static id="static_into_bug" runat="server" style='display: none;'></span>
<br>
<span class=static id="static_into_desc" runat="server" style='display: none;'></span>
<tr><td colspan=2><span class=err id="into_err" runat="server"> </span>
</tr>
<tr><td colspan=2 align=center><br>
<input class=btn type=submit runat="server" id="submit" value="Merge" OnServerClick="on_update">
</table>
<input type=hidden id="confirm" runat="server">
<input type=hidden id="prev_from_bug" runat="server">
<input type=hidden id="prev_into_bug" runat="server">
<input type=hidden id="orig_id" runat="server">
</form>
<p>
</td></tr></table></div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -