如何获取TFS集合的总代码行?

时间:2012-12-14 16:45:03

标签: tfs tfs2010

确定TFS集合中代码总数的最佳方法是什么?我是否需要以某种方式使用SDK才能执行此操作?或者是否有报告工具?

3 个答案:

答案 0 :(得分:1)

我不知道最好的方法,但您几乎肯定必须将源代码放入工作区,然后运行您选择的工具来计算“线条”(取决于您认为的“线条”)代码“)。

用于计算源文件中的行的工具没有结束,并且自己编写一行很简单,所以我不会尝试详细讨论该部分问题。

因此,另一部分是手动获取源代码到您的PC,或使用tf.exe从批处理文件或类似文件中自动执行Get过程。棘手的一点是找出相当不友好的tf命令行,但如果你仔细阅读文档,这是一个非常容易实现的任务。

答案 1 :(得分:0)

我承认我在找一个很好的理由我不知所措,但是如果你得到整个集合,你就可以计算每个文件中具有代码类型的行数在其中(* .cs,vb,aspx等)

许多工具可以计算行数,但是如果你需要自己编号,你可以尝试计算像“。+ \ n”这样的正则表达式的出现次数。

答案 2 :(得分:-1)

多年前我写过这篇文章。它可以在本地文件夹上工作,所以如果你有TFS代码的本地副本,它仍然可以工作。不是最好的质量代码,而只是一种快速而肮脏的方式来获取可以复制到Excel的网格报告(同样,不是最好的自动化,但完成工作) -

[添加表单应用程序中需要的一些控件]

    private static int totalLinesCount = 0;
    private static int totalLinesOfCode = 0;
    private static int totalComments = 0;

    private void btnCount_Click(object sender, EventArgs e)
    {
        try
        {
            totalLinesCount = 0;
            totalLinesOfCode = 0;
            totalComments = 0;
            lblTotalCount.Text = "";
            DirectoryInfo di = new DirectoryInfo(txtFileName.Text);
            if (di.Exists)
            {
                FileInfo[] fis = di.GetFiles(txtSearchPattern.Text, SearchOption.AllDirectories);
                rtbReport.Text = "";
                Dictionary<string, int> dictionary = new Dictionary<string, int>();
                DataSet ds = new DataSet("Report");
                DataTable dt = new DataTable();
                dt.Columns.Add("FileName", typeof(string));
                dt.Columns.Add("TotalCount", typeof(string));
                dt.Columns.Add("Code", typeof(string));
                dt.Columns.Add("Commented", typeof(string));
                dt.Columns.Add("Summary", typeof(string));
                ds.Tables.Add(dt);
                foreach (FileInfo fi in fis)
                {
                    if (fi.Exists)
                    {
                        int fileLinesCount = File.ReadAllLines(fi.FullName).Length;
                        int commentedCode = 0;

                        foreach (string line in File.ReadLines(fi.FullName))
                        {
                            if (line.TrimStart().StartsWith("/") || (line.TrimStart().StartsWith("*")))
                            {
                                commentedCode++;
                            }
                        }

                        rtbReport.Text += string.Format("{0}: {1}; Actual Code: {2}; Commented lines: {3};{4}",
                            fi.Name, fileLinesCount.ToString(), fileLinesCount - commentedCode, commentedCode,"\n");
                        totalLinesCount += fileLinesCount;
                        totalComments += commentedCode;

                        DataRow dr = ds.Tables[0].NewRow();
                        dr["FileName"] = fi.Name;
                        dr["TotalCount"] = fileLinesCount;
                        dr["Code"] = fileLinesCount - commentedCode;
                        dr["Commented"] = commentedCode;
                        dr["Summary"] = string.Format("Code: {0}, Commented: {1}, Total: {2}",
                            fileLinesCount-commentedCode, commentedCode, fileLinesCount);

                        ds.Tables[0].Rows.Add(dr);
                    }
                }
                if (ds.Tables.Count > 0)
                {
                    dataGridView1.DataSource = ds.Tables[0].DefaultView;

                    dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                    dataGridView1.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
                    dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                }

                totalLinesOfCode = totalLinesCount - totalComments;

                lblTotalCount.Text = string.Format("{0}: {1}; Code: {2}; Comments: {3}",
                    "Total Number of lines in all files", totalLinesCount.ToString(),
                    totalLinesOfCode.ToString(), totalComments.ToString());
                rtbReport.Text += lblTotalCount.Text;
            }
            else
                MessageBox.Show("Folder does not exist. Select a valid folder",
                    "Folder not found", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }